void cmdline_parse(char *cmdline)
{
- char opt[100], *optval, *q;
+ char opt[100], *optval, *optkey, *q;
const char *p = cmdline;
struct kernel_param *param;
-
+ int invbool;
+
if ( p == NULL )
return;
break;
/* Grab the next whitespace-delimited option. */
- q = opt;
+ q = optkey = opt;
while ( (*p != ' ') && (*p != '\0') )
{
if ( (q-opt) < (sizeof(opt)-1) ) /* avoid overflow */
else
optval = q; /* default option value is empty string */
+ /* Boolean parameters can be inverted with 'no-' prefix. */
+ invbool = !strncmp("no-", optkey, 3);
+ if ( invbool )
+ optkey += 3;
+
for ( param = &__setup_start; param <= &__setup_end; param++ )
{
- if ( strcmp(param->name, opt ) != 0 )
+ if ( strcmp(param->name, optkey) )
continue;
switch ( param->type )
simple_strtol(optval, (const char **)&optval, 0);
break;
case OPT_BOOL:
- *(int *)param->var = 1;
+ *(int *)param->var = !invbool;
+ break;
+ case OPT_INVBOOL:
+ *(int *)param->var = invbool;
break;
case OPT_CUSTOM:
((void (*)(const char *))param->var)(optval);
*/
struct kernel_param {
const char *name;
- enum { OPT_STR, OPT_UINT, OPT_BOOL, OPT_CUSTOM } type;
+ enum { OPT_STR, OPT_UINT, OPT_BOOL, OPT_INVBOOL, OPT_CUSTOM } type;
void *var;
unsigned int len;
};
static char __setup_str_##_var[] __initdata = _name; \
static struct kernel_param __setup_##_var __attribute_used__ \
__initsetup = { __setup_str_##_var, OPT_BOOL, &_var, sizeof(_var) }
+#define invboolean_param(_name, _var) \
+ static char __setup_str_##_var[] __initdata = _name; \
+ static struct kernel_param __setup_##_var __attribute_used__ \
+ __initsetup = { __setup_str_##_var, OPT_INVBOOL, &_var, sizeof(_var) }
#define integer_param(_name, _var) \
static char __setup_str_##_var[] __initdata = _name; \
static struct kernel_param __setup_##_var __attribute_used__ \